package com.leedsoft.config.spring_config;

import org.springframework.context.annotation.Import;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * 配置Security
 */
//@Configuration//可省略，因为@EnableWebMvc注解了@Configuration
@EnableWebSecurity
@Import(SecurityMethodConfig.class)//组合SecurityMethodConfig配置，引入时只需要引入当前类
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {

    @Override//配置web请求过滤细节
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()//配置请求授权
                .antMatchers("/resources/**").anonymous()//静态资源不拦截//最佳实践的静态资源位置
                .mvcMatchers("/login").anonymous()//登录页不拦截
                .anyRequest().authenticated()//其他所有请求，必须认证
                .and()
                .formLogin()//配置表单登录
                /**
                 * 自定义登录页
                 *
                 * 查看loginPage方法源代码文档说明
                 * 必须调用loginPage方法，否则，会使用默认控制器。无视自定义控制器。
                 * 调用loginPage之后，配置一个GET 的/login 控制器，覆盖默认，从而自定义登录页。。POST请求还用默认的。

                 设置登录成功后的跳转页：defaultSuccessUrl
                 * 如果之前访问了需要认证的url，则登录成功后跳转到该url。否则跳转到这里设置的url
                 * */
                .loginPage("/login")//
                .defaultSuccessUrl("/index")
                .and()
                .rememberMe()//启用rememberMe
                .tokenValiditySeconds(60*60*24)
                .and()
                .sessionManagement().maximumSessions(1)//限制一个帐号只能有一个session

        ;
    }

    @Override//配置 用户存储
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()//builder 链式编程风格
                .withUser("lizi").password("zlz123456").roles("USER")
                //ROLE_USER 权限。。。role仅仅是包含ROLE_前缀的authority
                //authority权限字符串
                .and()
                .withUser("yike").password("wcc123456").roles("ADMIN");
//        auth.userDetailsService(customUserDetailsService);//用户自定义用户服务
//        auth.jdbcAuthentication()//基于数据库
    }
}
